//
//  UIBezierPath.swift
//  Documentation
//
//  Created by Toj on 2/7/23.
//

@available(iOS 3.2, *)
open class UIBezierPath : NSObject, NSCopying, NSSecureCoding {
    
    // 初始化
    /* 初始化: 矩形 */
    public convenience init(rect: CGRect)
    
    /* 初始化: rect内切曲线 */
    public convenience init(ovalIn rect: CGRect)
    
    /* 初始化: 圆形. 当矩形变成正圆的时候, Radius就不再起作用 */
    public convenience init(roundedRect rect: CGRect, cornerRadius: CGFloat)
    
    /* 初始化: 特定的角为圆角的矩形 */
    public convenience init(roundedRect rect: CGRect, byRoundingCorners corners: UIRectCorner, cornerRadii: CGSize)
    
    /* 初始化: 创建圆弧 */
    public convenience init(arcCenter center: CGPoint, radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat, clockwise: Bool)
    
    /* 根据已有路径创建 */
    public convenience init(cgPath CGPath: CGPath)
    
    /* 初始化 */
    public init()
    
    public init?(coder: NSCoder)
    
    // 将UIBezierPath类转换成CGPath，类似于UIColor的CGColor
    open var cgPath: CGPath
    
    // 移动到某一点
    open func move(to point: CGPoint)
    
    // 绘制一条线
    open func addLine(to point: CGPoint)
    
    // 创建三次贝塞尔曲线
    open func addCurve(to endPoint: CGPoint, controlPoint1: CGPoint, controlPoint2: CGPoint)
    
    // 创建二次贝塞尔曲线
    open func addQuadCurve(to endPoint: CGPoint, controlPoint: CGPoint)
    
    // 添加圆弧
    open func addArc(withCenter center: CGPoint, radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat, clockwise: Bool)
    
    // 闭合路径，即在终点和起点连一根线
    open func close()
    
    
    // 清空路径
    open func removeAllPoints()
    
    // 追加路径
    open func append(_ bezierPath: UIBezierPath)
    
    // 扭转路径，即起点变成终点，终点变成起点, 翻转
    open func reversing() -> UIBezierPath
    
    
    // Transforming paths
    // 路径进行仿射变换
    open func apply(_ transform: CGAffineTransform)
    
    
    // Path info
    // 路径上是否有有效的元素
    open var isEmpty: Bool { get }
    // 和view的bounds是不一样的，它获取path的X坐标、Y坐标、宽度，但是高度为0
    open var bounds: CGRect { get }
    // 当前path的位置，可以理解为path的终点
    open var currentPoint: CGPoint { get }
    
    open func contains(_ point: CGPoint) -> Bool
    
    
    // Drawing properties
    // path宽度
    open var lineWidth: CGFloat
    // path端点样式，有3种样式
    open var lineCapStyle: CGLineCap
    // 连接点样式
    open var lineJoinStyle: CGLineJoin
    // 最大斜接长度(只有在使用kCGLineJoinMiter是才有效), 边角的角度越小，斜接长度就会越大
    // 为了避免斜接长度过长, 使用lineLimit属性限制, 如果斜接长度超过miterLimit, 边角就会以KCALineJoinBevel类型来显示
    open var miterLimit: CGFloat // Used when lineJoinStyle is kCGLineJoinMiter
    // 弯曲路径的渲染精度, 默认为0.6, 越小精度越高, 相应的更加消耗性能
    open var flatness: CGFloat
    
    // 单双数圈规则是否用于绘制路径, 默认是false
    open var usesEvenOddFillRule: Bool = false
    
    // 绘制虚线
    open func setLineDash(_ pattern: UnsafePointer<CGFloat>?, count: Int, phase: CGFloat)
    
    open func getLineDash(_ pattern: UnsafeMutablePointer<CGFloat>?, count: UnsafeMutablePointer<Int>?, phase: UnsafeMutablePointer<CGFloat>?)
    
    
    // Path operations on the current graphics context
    // 填充
    open func fill()
    // 描边，路径创建需要描边才能显示出来
    open func stroke()
    
    
    // 设置描边的混合模式
    open func fill(with blendMode: CGBlendMode, alpha: CGFloat)
    // 设置填充的混合模式
    open func stroke(with blendMode: CGBlendMode, alpha: CGFloat)
    
    // 修改当前图形上下文的绘图区域可见,随后的绘图操作导致呈现内容只有发生在指定路径的填充区域
    open func addClip()
}
